﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Interfaces;
using System.Data.SqlClient;
using Indstillinger;

namespace Model
{
    [Serializable]
    public class Produkt : IProduktdata //Implementer interface
    {
        //Attributter
        private string produktNr;
        private string betegnelse;
        private int stkPrPakke;
        private int beholdning;
        private int minimumBeholdning;
        private double pakkePris;
        private Leverandør leverandør; // Associering til leverandør
        private List<Forbrug> forbrugListe; //Liste til aggegering af Forbrug
        
        [NonSerialized] private int tempForbrugAntal;

        //Konstruktør

        public Produkt(string produktNr, string betegnelse, int stkPrPakke, int beholdning, int minimumBeholdning, double pakkePris, Leverandør leverandør)
        {
            this.produktNr = produktNr;
            this.betegnelse = betegnelse;
            this.stkPrPakke = stkPrPakke;
            this.beholdning = beholdning;
            this.minimumBeholdning = minimumBeholdning;
            this.pakkePris = pakkePris;
            this.leverandør = leverandør;
            this.forbrugListe = new List<Forbrug>();
            this.tempForbrugAntal = 0;
        }

        // Statiske metoder
        internal static Produkt OpretProdukt(string produktNr, string betegnelse, int stkPrPakke, int beholdning, int minimumBeholdning, double pakkePris, Leverandør leverandør)
        {
            SqlConnection con = new SqlConnection(DbIndstillinger.HentConnectionString());
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = con;
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            con.Open();

            cmd.CommandText = "OpretProdukt";
            cmd.Parameters.Add("@leverandørId", System.Data.SqlDbType.Int).Value = leverandør.LeverandørId;
            cmd.Parameters.Add("@produktNr", System.Data.SqlDbType.NVarChar).Value = produktNr;
            cmd.Parameters.Add("@betegnelse", System.Data.SqlDbType.NVarChar).Value = betegnelse;
            cmd.Parameters.Add("@beholdning", System.Data.SqlDbType.Int).Value = beholdning;
            cmd.Parameters.Add("@stkPrPakke", System.Data.SqlDbType.Int).Value = stkPrPakke;
            cmd.Parameters.Add("@minimumsbeholdning", System.Data.SqlDbType.Int).Value = minimumBeholdning;
            cmd.Parameters.Add("@pakkepris", System.Data.SqlDbType.Float).Value = pakkePris;

            if (cmd.ExecuteNonQuery() != 1)
                return null;

            con.Close();

            return new Produkt(produktNr, betegnelse, stkPrPakke, beholdning, minimumBeholdning, pakkePris, leverandør);
        }

        //Metoder
        private void opdaterMig()
        {
            SqlConnection con = new SqlConnection(DbIndstillinger.HentConnectionString());
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = con;
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            con.Open();

            cmd.CommandText = "hentEtProdukt";
            cmd.Parameters.Add("@produktNr", System.Data.SqlDbType.NVarChar).Value = produktNr;

            SqlDataReader reader = cmd.ExecuteReader();
            reader.Read();

            betegnelse =(string)reader["betegnelse"];
            stkPrPakke = (int)reader["stkPrPakke"];
            beholdning = (int)reader["beholdning"];
            minimumBeholdning = (int)reader["minimumsbeholdning"];
            pakkePris = (double)reader["pakkepris"];

            reader.Close();
            con.Close();

        }

        public void OpskrivBeholdning(int antal)
        {
            this.beholdning += antal;
        }

        public void NedskrivBeholdning()
        {  
            SqlConnection con = new SqlConnection(DbIndstillinger.HentConnectionString());
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = con;
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            con.Open();

            cmd.CommandText = "nedskrivProduktBeholdning";
            cmd.Parameters.Clear();
            cmd.Parameters.Add("@produktNr", System.Data.SqlDbType.NVarChar).Value = this.produktNr;
            cmd.ExecuteNonQuery();
            con.Close();

            this.beholdning -= 1;
            Forbrug nyForbrug = new Forbrug(this.produktNr);
            this.forbrugListe.Add(nyForbrug);
        }

        public void Rediger(string produktNr, string betegnelse, int stkPrPakke, int beholdning, int minimumBeholdning, double pakkePris, Leverandør leverandør)
        {
            SqlConnection con = new SqlConnection(DbIndstillinger.HentConnectionString());
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = con;
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            con.Open();

            cmd.CommandText = "RedigerProdukt";
            cmd.Parameters.Add("@leverandørId", System.Data.SqlDbType.Int).Value = leverandør.LeverandørId;
            cmd.Parameters.Add("@produktNr", System.Data.SqlDbType.NVarChar).Value = produktNr;
            cmd.Parameters.Add("@betegnelse", System.Data.SqlDbType.NVarChar).Value = betegnelse;
            cmd.Parameters.Add("@beholdning", System.Data.SqlDbType.Int).Value = beholdning;
            cmd.Parameters.Add("@stkPrPakke", System.Data.SqlDbType.Int).Value = stkPrPakke;
            cmd.Parameters.Add("@minimumsbeholdning", System.Data.SqlDbType.Int).Value = minimumBeholdning;
            cmd.Parameters.Add("@pakkepris", System.Data.SqlDbType.Float).Value = pakkePris;

            if (cmd.ExecuteNonQuery() != 1)
                return;

            con.Close();

            this.betegnelse = betegnelse;
            this.stkPrPakke = stkPrPakke;
            this.beholdning = beholdning;
            this.minimumBeholdning = minimumBeholdning;
            this.pakkePris = pakkePris;
            this.leverandør = leverandør;
        }

        //Overloadede metoder til at se forbrug
        public void GetForbrug(DateTime startDato, DateTime slutDato)
        {
            int antal = 0;

            foreach (Forbrug forbrug in forbrugListe)
            {            
                if (forbrug.Dato.Date >= startDato && forbrug.Dato.Date <= slutDato)
                {
                    antal++;
                }
            }
            tempForbrugAntal = antal;
        }
        public void GetForbrug()
        {
            tempForbrugAntal = forbrugListe.Count();
        }

        //Properties
        public string ProduktNr
        {
            get { return produktNr; }
        }

        public string Betegnelse
        {
            get
            {
                if (betegnelse == null)
                    opdaterMig();
                return betegnelse;
            }
        }

        public int StkPrPakke
        {
            get
            {
                if (betegnelse == null)
                    opdaterMig(); 
                return stkPrPakke;
            }
        }

        public int Beholdning
        {
            get
            {
                if (betegnelse == null)
                    opdaterMig(); 
                return beholdning;
            }
        }

        public int MinimumBeholdning
        {
            get
            {
                if (betegnelse == null)
                    opdaterMig(); 
                return minimumBeholdning;
            }
        }

        public double PakkePris
        {
            get
            {
                if (betegnelse == null)
                    opdaterMig(); 
                return pakkePris;
            }
        }

        public int LeverandørId
        {
           get
            {
                if (betegnelse == null)
                    opdaterMig();
                return leverandør.LeverandørId;
            }
           
        }

        public string LeverandørNavn
        {
            get
            {
                if (betegnelse == null)
                    opdaterMig();
                return leverandør.Navn;
            }
        }

        public int TempForbrugAntal
        {
            get
            {
                if (betegnelse == null)
                    opdaterMig(); 
                return tempForbrugAntal;
            }
        }

        public int GetForbrugAntal
        {
            get { return this.forbrugListe.Count; }
        }
    }
}
